package com.lsh.bio;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Date;

/**
 * @author ：LiuShihao
 * @date ：Created in 2021/2/22 2:00 下午
 * @desc ：同步阻塞I/O的TimeServerHandler
 * 当有新的客户端接入的时候，以Socket为参数构造TimeServerhandler对象，TimerServerHandler是一个Runnable，
 * 使用它为构造函数的参数创建一个新的客户端线程来处理这条Socket链路。
 *
 */
public class TimeServerHandler implements Runnable {
    private Socket socket;
    //有参构造
    public TimeServerHandler(Socket socket){
        this.socket = socket;
    }

    @Override
    public void run() {
        BufferedReader in = null;
        PrintWriter out = null;
        try{
            in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
            out = new PrintWriter(this.socket.getOutputStream(),true);
            String currentTime = null;
            String body = null;
            /**
             * 通过BufferReader读取一行，如果已经读到了输入流的尾部，则返回值为null，退出循环，
             * 如果读到非空值，则对内容进行判断，
             * 如果请求消息为查询时间的指令"QUERY TIME ORDER" ，则获取当前系统最新的系统时间，通过PrintWriter的println的方法发送给客户端
             * 最后退出循环
             * 释放输入流、输出流和Socket套接字句柄资源
             */
            while (true){
                body = in.readLine();
                if (body == null){
                    break;
                }
                System.out.println("The time server receive order :"+body);
                currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body) ? new Date(System.currentTimeMillis()).toString() :"BAD ORDER";
                out.println(currentTime);
            }

        }catch (Exception e){
            if (in != null){
                try {
                    in.close();

                }catch (IOException e1){
                    e1.printStackTrace();
                }
            }
            if (out != null){
                out.close();
                out = null;
            }
            if (this.socket != null){
                try {
                    socket.close();
                }catch (IOException e1){
                    e1.printStackTrace();
                }
                this.socket = null;

            }

        }


    }


}
